package cn.song.utils;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 分页工具类
 *
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2016年11月4日 下午12:59:00
 */
@Data
@AllArgsConstructor
@ApiModel(value = "分页数据", description = "这是一个公共的返回的分页数据")
public class PageUtils<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 当前页码
     */
    @ApiModelProperty(value = "当前页码")
    private int currentPage;
    /**
     * 每页条数
     */
    @ApiModelProperty(value = "每页条数")
    private int pageSize;
    /**
     * 记录总数
     */
    @ApiModelProperty(value = "记录总数")
    private long totalSize;
    /**
     * 页码总数
     */
    @ApiModelProperty(value = "页码总数")
    private int totalPages;
    /**
     * 返回数据
     */
    @ApiModelProperty(value = "返回数据")
    private List<T> list;


    /**
     * 自动封装
     *
     * @param list      列表
     * @param pageUtils 页面实用程序
     * @return {@link PageUtils }
     * @date 2024/03/01
     * @author SongRenShuo
     */
    public static <T> PageUtils<T> getPageInfo(List<T> list, PageUtils<T> pageUtils) {
        PageInfo<T>  pageInfo = new PageInfo<> (list);
        pageUtils.setTotalSize(pageInfo.getTotal());
        pageUtils.setTotalPages(pageInfo.getPages());
        pageUtils.setList(pageInfo.getList());
        PageHelper.clearPage();
        return pageUtils;
    }

    /**
     * 自动封装
     *
     * @param list      列表
     * @param pageUtils 页面实用程序
     * @return {@link PageUtils }
     * @date 2024/03/01
     * @author SongRenShuo
     */
    public static <T> PageUtils<T> getPageInfo02(List<T> list, PageUtils<T> pageUtils, Integer total) {
        int pageSize = pageUtils.getPageSize();

        pageUtils.setTotalSize(total);
        int totalPage = (total + pageSize - 1) / pageSize;
        pageUtils.setTotalPages(totalPage);
        pageUtils.setList(list);

        // 当total为0或pageSize过大导致totalPage为0时，可以设置一个默认值
        if (total == 0 || totalPage == 0) {
            pageUtils.setTotalPages(1);
        }

        return pageUtils;
    }

    /**
     * 分页构造
     *
     * @param currentPage 当前页
     * @param pageSize    条数
     * @date 2024/03/01
     * @author SongRenShuo
     */
    public PageUtils(Integer currentPage, Integer pageSize) {
        this.currentPage = currentPage;
        this.pageSize = pageSize;
    }

    /**
     * 默认值
     *
     * @date 2024/03/01
     * @author SongRenShuo
     */
    public PageUtils() {
        this.currentPage = 1;
        this.pageSize = 10;
    }

}
